package com.aizuda.boot.modules.business.negotiation.service;

import com.aizuda.boot.modules.business.contract.dto.SingleResponse;
import com.aizuda.boot.modules.business.negotiation.entity.dto.CreateNegotiationReqDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationListReqDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.ContractVersionHistoryRespDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.InviteNegotiationReqDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationAnnouncementRespDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationAnnouncementListRespDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationAnnouncementListReqDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationAnnouncementUpdateReqDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationAnnouncementDeleteReqDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationAnnouncementCreateReqDTO;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationInstanceAnnouncementUpdateReqDTO;
import com.aizuda.boot.modules.business.negotiation.entity.vo.CreateNegotiationRespDTO;
import com.aizuda.boot.modules.business.negotiation.entity.vo.NegotiationListRespDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.aizuda.boot.modules.business.negotiation.entity.ContractNegotiationInstanceEntity;
import com.aizuda.boot.modules.business.negotiation.entity.ContractNegotiationNodeInstanceEntity;

import java.util.List;
import java.util.Map;

/**
 * 合同协商服务接口
 */
public interface ContractNegotiationService {
    
    /**
     * 查询协商列表
     * @param dto 查询条件
     * @return 协商列表分页数据
     */
    Page<NegotiationListRespDTO> getNegotiationList(NegotiationListReqDTO dto);
    
    /**
     * 创建新的协商实例
     * @param dto 创建协商请求参数
     * @return 创建结果
     */
    CreateNegotiationRespDTO createNegotiation(CreateNegotiationReqDTO dto);
    
    /**
     * 根据合同ID查询协商实例信息（包含流程实例ID和任务ID）
     * @param contractId 合同ID
     * @return 协商实例信息
     */
    ContractNegotiationInstanceEntity getNegotiationByContractId(Integer contractId);
    
    /**
     * 根据合同ID查询协商实例信息（包含所有状态：进行中、已完成等）
     * @param contractId 合同ID
     * @return 协商实例信息
     */
    ContractNegotiationInstanceEntity getNegotiationByContractIdAllStatus(Integer contractId);
    
    /**
     * 根据协商实例ID查询当前任务信息
     * @param negotiationInstanceId 协商实例ID
     * @return 当前任务信息
     */
    ContractNegotiationNodeInstanceEntity getCurrentTask(Integer negotiationInstanceId);
    
    /**
     * 获取协商实例的完整信息（包含所有节点和参与者信息）
     * @param contractId 合同ID
     * @return 协商实例完整信息
     */
    Map<String, Object> getNegotiationFullInfo(Integer contractId);
    
    /**
     * 更新参与者的查看状态
     * @param contractId 合同ID
     * @param userId 用户ID
     */
    void updateParticipantViewStatus(Integer contractId, Long userId);
    
    /**
     * 检查用户是否已经查看过协商信息
     * @param contractId 合同ID
     * @param userId 用户ID
     * @return true-已查看过，false-未查看过
     */
    boolean hasUserViewedNegotiation(Integer contractId, Long userId);
    
    /**
     * 根据合同ID删除协商实例及相关数据
     * @param contractId 合同ID
     * @return 是否删除成功
     */
    boolean deleteNegotiationByContractId(Integer contractId);

    /**
     * 邀请用户参与协商
     * @param dto 邀请协商请求参数
     * @return 是否邀请成功
     */
    boolean inviteNegotiation(InviteNegotiationReqDTO dto);
    /**
     * 根据合同ID激活协商
     * 将协商实例状态修改为协商中，并激活第一个节点
     * @param contractId 合同ID
     * @param announcementText 协商公告
     * @return 是否激活成功
     */
    boolean resumeNegotiationByContractId(Integer contractId, String announcementText);

    /**
     * 获取合同版本历史列表
     * @param contractId 合同ID
     * @return 版本历史列表
     */
    List<ContractVersionHistoryRespDTO> getContractVersionHistory(Integer contractId);

    /**
     * 退出协商
     * @param contractId 合同ID
     * @param userId 用户ID
     * @return 是否退出成功
     */
    boolean exitNegotiation(Integer contractId, Long userId);

    /**
     * 取消协商
     * @param contractId 合同ID
     * @return 是否取消成功
     */
    boolean cancelNegotiation(Integer contractId);


    /**
     * 获取当前用户的协商公告配置
     * @return 协商公告配置信息
     */
    NegotiationAnnouncementRespDTO getNegotiationAnnouncement();

    /**
     * 获取协商公告配置列表
     * @return 协商公告配置列表
     */
    Page<NegotiationAnnouncementListRespDTO> getNegotiationAnnouncementList(NegotiationAnnouncementListReqDTO dto);

    /**
     * 更新协商公告配置
     * @param dto 更新请求参数
     * @return 是否更新成功
     */
    boolean updateNegotiationAnnouncement(NegotiationAnnouncementUpdateReqDTO dto);

    /**
     * 删除协商公告配置
     * @param dto 删除请求参数
     * @return 是否删除成功
     */
    boolean deleteNegotiationAnnouncement(NegotiationAnnouncementDeleteReqDTO dto);

    /**
     * 创建新的协商公告配置
     * @param dto 创建请求参数
     * @return 是否创建成功
     */
    boolean createNegotiationAnnouncement(NegotiationAnnouncementCreateReqDTO dto);

    /**
     * 更新协商实例公告
     * @param dto 更新请求参数
     * @return 更新结果
     */
    boolean updateNegotiationInstanceAnnouncement(NegotiationInstanceAnnouncementUpdateReqDTO dto);
    
    /**
     * 根据合同ID获取协商参与人员信息（审核流程专用）
     * @param contractId 合同ID
     * @return 参与人员列表
     */
    List<com.aizuda.boot.modules.system.entity.vo.DepartmentHeadVO> getNegotiationParticipantsByContractId(Long contractId);
}